#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include"args.h"
#include"str.h"

/**
 * 参数出错时的帮助提醒
 */
void printHelp(){
    printf("usage: fangdai -t -m -r [-e -f [-E -F ]]\n");
    puts("\n参数说明:");
    puts("\t-t total_months: 贷款总期数,必需参数");
    puts("\t-m total_money:  贷款总额(元),必需参数");
    puts("\t-r year_rate: 年利率,用小数表示,例如0.049,必需参数");
    puts("\t-e event_month: 第一次提前还款时已经还完的期数,此参数必须和-f参数同时使用");
    puts("\t-f forward_money: 第一次提前还款的还款额(元),此参数必须和-e参数同时使用");
    puts("\t-E event_month2: 第二次提前还款时已经还完的期数,此参数要求-e和-f参数提供的基础上才能使用,并且要和-F同时使用");
    puts("\t-F forward_money2: 第二次提前还款的金额,此参数要求-e和-f参数提供的基础上才能使用,并且要和-E同时使用");
}


/**
 * 参数打印函数
 */
void printArgs(args_t * args){
    
    if(args->total_money){
        printf("总贷款额:%f\n",args->total_money);
    }
    if(args->total_months){
        printf("贷款期限:%d\n",args->total_months);
    }
    if(args->year_rate){
        printf("贷款年利率:%f\n",args->year_rate);
    }
    if(args->event_month){
        printf("提前还款月份:%d\n",args->event_month);
    }
    if(args->forward_money){
        printf("提前还款额:%f\n",args->forward_money);
    }

}
extern char error_info [512];

/**
 * 单个参数解析函数
 */
static int process(char * valueStr, char arg_key, args_t * args){
       
    switch(arg_key){
        case 'm': args->total_money = atof(valueStr);
            if(!args->total_money){
                sprintf(error_info,"%s文件%d行报错:-m参数不能正确解析",__FILE__,__LINE__);
                return 1;
            }
            break;
        case 't': args->total_months = atoi(valueStr);
            if(!args->total_months){
                sprintf(error_info,"%s文件%d行报错:-t参数不能正确解析",__FILE__,__LINE__);
                return 1;
            }
            break;
        case 'r': args->year_rate = atof(valueStr);
            if(!args->year_rate){
                sprintf(error_info,"%s文件%d行报错:-r参数不能正确解析",__FILE__,__LINE__);
                return 1;
            }
            break;
        case 'e': args->event_month = atoi(valueStr);
            if(!args->event_month){
                sprintf(error_info,"%s文件%d行报错:-e参数不能正确解析",__FILE__,__LINE__);
                return 1;
            }
            break;
        case 'f': args->forward_money = atof(valueStr);
            if(!args->forward_money){
                sprintf(error_info,"%s文件%d行报错:-f参数不能正确解析",__FILE__,__LINE__);
                return 1;
            }
            break;
        case 'E': args->event_month2 = atoi(valueStr);
            if(!args->event_month2){
                sprintf(error_info,"%s文件%d行报错:-E参数不能正确解析",__FILE__,__LINE__);
                return 1;
            }
            break;
        case 'F': args->forward_money2 = atof(valueStr);
            if(!args->forward_money2){
                sprintf(error_info,"%s文件%d行报错:-F参数不能正确解析",__FILE__,__LINE__);
                return 1;
            }
            break;
        default: 
            sprintf(error_info,"%s文件%d行报错:未知的-%c参数键",__FILE__,__LINE__,arg_key);
            return 1;
    }
    return 0;
}

/**
 * 所有参数解析函数
 */
int  parseArgs(int argc,char ** argv, args_t * args){
    
    for(int i=1;i<argc;i++){
        char * arg = argv[i];
        char * valueStr = NULL;
        if( !strncmp(arg,"-",1) ){
            //单独的 "-"报错
            if(strlen(arg)==1){
                sprintf(error_info,"%s文件%d行报错:参数格式错误,出现了单独的'-'",__FILE__,__LINE__);
                return 1;
            }
            //参数形式: -m 10000
            if(strlen(arg)==2 ){
                i++;
                if(i>=argc){
                    sprintf(error_info,"%s文件%d行报错: -%c参数缺失参数值",__FILE__,__LINE__,arg[1]); 
                    return 1;
                }
                valueStr = argv[i];            
            }else{ //参数形式如: -m10000
                valueStr = arg+2;
            }
            if(check_digital_string(valueStr)){
                sprintf(error_info,"%s文件%d行报错:-%c参数值[%s]格式非法",__FILE__,__LINE__,arg[1],valueStr);
                return 1;
            }
            //处理单个参数
            int ret = process(valueStr,arg[1],args);
            if(ret){
                return ret;
            }
        }else{ 
            sprintf(error_info,"%s文件%d行报错:出现非法参数:%s",__FILE__,__LINE__,arg);
            return 1;
        }
    }
    return 0;
}
